package de.hdu.mfz.ctrl;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import de.hdu.mfz.dao.UserDAO;
import de.hdu.mfz.dto.AJAXMessage;
import de.hdu.mfz.model.User;

@Controller
public class LoginController {
	UserDAO userDAO;
	
	public void setUserDAO (UserDAO u) {
		this.userDAO = u;
	}
	
	
	/** Anmelden  (Session erzeugen)
	 * 
	 * @param benutzername
	 * @param passwort
	 * @param session (HTTPSession, Wird von Swing übergeben)
	 * @return Objekt vom Typ AJAXMessages. AJAXMessages.returnMessage enthält ggf. eine Fehlermeldung
	 */
	@RequestMapping(value="/login.json", method=RequestMethod.POST)
	public @ResponseBody AJAXMessage login(String benutzername, String passwort, HttpSession session) {

		User foundUser=null;
	
		foundUser = this.userDAO.findByUsername(benutzername);
		
		if (foundUser != null) {
			if (foundUser.getPasswort().equals(passwort)) {
				session.setAttribute("userid", foundUser.getUserId());
				session.setMaxInactiveInterval(30*60); //Session läuft automatisch nach 30 Min ab.
				return new AJAXMessage(true, AJAXMessage.FailureCode.None, "");
			} else {
					return new AJAXMessage(false, AJAXMessage.FailureCode.LoginRequired, "Falscher Benutzername oder falsches Passwort.");	
			}
		} else { 
			return new AJAXMessage(false, AJAXMessage.FailureCode.LoginRequired, "Falscher Benutzername oder falsches Passwort.");
		}
	}	

	/** Abmelden (Session löschen)
	 * 
	 * @param session (HTTPSession, Wird von Swing übergeben)
	 * @return Objekt vom Typ AJAXMessages. 
	 */
	@RequestMapping(value="/logout.json", method=RequestMethod.POST)
	public @ResponseBody AJAXMessage logout(HttpSession session) {
		session.invalidate(); 
		return new AJAXMessage(true, AJAXMessage.FailureCode.None, "");
	}

	/** Prüfen, ob User aktuell angemeldet ist und ob Session noch gültig ist.
	 * 
	 * @param session (HTTPSession, Wird von Swing übergeben)
	 * @return Objekt vom Typ AJAXMessages. AJAXMessages.returnMessage enthält ggf. eine Fehlermeldung, wenn User nicht angemeldet oder Session nicht mehr gültig ist.
	 */
	@RequestMapping(value="/checkSession.json", method=RequestMethod.POST)
	public @ResponseBody AJAXMessage checkSession(HttpSession session) {
		/*Wenn getUserFromSession keine Exception produziert, dann ist die Sitzung gültig
		 *und die Funktion gibt true zurück. Ansonsten wird false und der Grund zurückgegeben
		 *warum die Session nicht mehr gültig ist (=Fehlermeldung)*/
		try {
			getUserFromSession(session);
		} catch (Exception e) {
			return new AJAXMessage(false, AJAXMessage.FailureCode.None, e.getMessage());
		}
		return new AJAXMessage(true, AJAXMessage.FailureCode.None, "");
	}

	
	/**Hilfsfunktion zum Prüfen ob eine Session gültig ist
	 * 
	 * @param session (HTTPSession, Wird von Swing übergeben)
	 * @return User Objekt
	 * @throws Exception Wenn Session nicht mehr gültig ist.
	 */
	public User getUserFromSession(HttpSession session) throws Exception {
		if (session.getAttribute("userid") == null) {
			throw new Exception(""); //Benutzer ist nicht angemeldet, Session ist ungültig
		}
		int uid = (Integer)session.getAttribute("userid");
		
		User foundUser=null;
		
		//Dann prüfen, ob es user gibt
		foundUser = this.userDAO.findById(uid) ;
		if (foundUser == null)
			throw new Exception("Ihre Zugangsdaten sind nicht mehr gültig.");
		
		return foundUser;
	}
	
}
